/**
 * Copyright 2010 Adam Ruggles.
 * 
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 * http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package saig.engine;

import saig.engine.enums.GameStatus;
import saig.engine.models.Player;

/**
 * The observable game environment.
 * @author Adam
 * @version $Id$
 * 
 * Created on Jun 5, 2010 at 3:39:37 PM 
 */
public interface Environment {
	/**
	 * The number of coins collected.
	 * @return The number of coins collected.
	 */
	int getCoinsCollected();
	/**
	 * Returns the total distance traversed in a level.
	 * @return The total distance traversed in a level.
	 */
	float getDistance();
	/**
	 * Returns an array containing enemy type and location.
	 * [i] contains the enemy type.
	 * [i+1] contains the enemy x position.
	 * [i+2] contains the enemy y position.
	 * @return An array containing enemy type and location.
	 */
	float[] getEnemiesPositions();
	/**
	 * Returns the number of flowers collected.
	 * @return The number of flowers collected.
	 */
	int getFlowersCollected();
	/**
	 * Returns the current game status.
	 * @return The current game status.
	 */
	GameStatus getGameStatus();
	/**
	 * Returns the total number of enemy kills.
	 * @return The total number of enemy kills.
	 */
	int getKills();
	/**
	 * Returns the number of kills for enemies killed by fireball.
	 * @return The number of kills for enemies killed by fireball.
	 */
	int getKillsByFire();
	/**
	 * Returns the number of kills for enemies killed by being shelled.
	 * @return The number of kills for enemies killed by being shelled.
	 */
	int getKillsByShell();
	/**
	 * Returns the number of kills for enemies killed by being stomped.
	 * @return The number of kills for enemies killed by being stomped.
	 */
	int getKillsByStomp();
	/**
	 * The number of mushrooms collected.
	 * @return The number of mushrooms collected.
	 */
	int getMushroomsCollected();
	/**
	 * Returns a 22x22 grid of a merged view of enemies and level information at a zoom level.
	 * TODO document zoom.
	 * @param zoomLevel The level zoom amount.
	 * @param zoomEnemies The enemies zoom amount.
	 * @return A 22x22 grid of level elements at a zoom level.
	 */
	int[][] getObservable(int zoomLevel, int zoomEnemies);
	/**
	 * Returns a 22x22 grid of enemies at a zoom level.
	 * TODO document zoom.
	 * @param zoom The enemies zoom amount.
	 * @return A 22x22 grid of enemies at a zoom level.
	 */
	int[][] getObservableEnemies(int zoom);
	/**
	 * Returns a 22x22 grid of level elements at a zoom level.
	 * TODO document zoom.
	 * @param zoom The level zoom amount.
	 * @return A 22x22 grid of level elements at a zoom level.
	 */
	int[][] getObservableLevel(int zoom);
	/**
	 * Returns an enum containing the current mode the player is in.
	 * @return The current mode the player is in.
	 */
	Player.Mode getPlayerMode();
	/**
	 * Returns an array with two cells. At position [0] the player's
	 * x position is stored. At position [1] the x position is stored.
	 * @return An array with the x and y position of the player.
	 */
	float[] getPlayerPosition();
	/**
	 * Returns an enum containing the current state the player is in.
	 * @return The current state the player is in.
	 */
	Player.State getPlayerState();
	/**
	 * Returns the total tile distance traversed in a level.
	 * @return The total tile distance traversed in a level.
	 */
	int getTileDistance();
	/**
	 * Returns the amount of time that is remaining.
	 * @return The amount of time that is remaining.
	 */
	int getTimeRemaining();
	/**
	 * Returns the amount of time that has been used up.
	 * @return The amount of time that has been used up.
	 */
	int getTimeSpent();
	/**
	 * Is the player able to fire a weapon.
	 * @return True if the player can fire a weapon.
	 */
	boolean isPlayerAbleToFire();
	/**
	 * Is the player in a position where they can jump.
	 * @return True if the player can jump.
	 */
	boolean isPlayerAbleToJump();
	/**
	 * Is the player hold on object.
	 * @return True if the player is carrying an object.
	 */
	boolean isPlayerCarrying();
	/**
	 * Is the player on a solid surface/ground.
	 * @return True if the player is on the ground.
	 */
	boolean isPlayerOnGround();
}
